package com.yc.project1;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;

import javax.sql.DataSource;

/**
 * @author zwei
 * @create 2024-08-07 14:25
 */
@Configuration  //声明这是一个配置类
@ComponentScan  // 扫描包
@PropertySource("db.properties")        //利用@PropertySource注解加载mysql数据库配置文件
@EnableAspectJAutoProxy         // 开启AOP
@EnableCaching  //开启缓存
public class AppDataSourceConfig {
    @Value("${name}")
    private String username;
    @Value("${pwd}")
    private String password;
    @Value("${driver}")
    private String driverClassName;
    @Value("${url}")
    private String url;

    // 声明缓存管理器--》给Dao层加入缓存管理器
    @Bean
    public CacheManager cacheManager() {
        // 返回一个ConcurrentMapCacheManager的实例，其中包含一个名为"users"的缓存区域，用于存储和管理相关的数据
        return new ConcurrentMapCacheManager("users");
    }

    // 声明事务管理器--》给业务层加入事务管理器
    @Bean
    public TransactionManager transactionManager(DataSource ds) {
        DataSourceTransactionManager tm = new DataSourceTransactionManager();
        tm.setDataSource(ds);
        return tm;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(@Autowired DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(initMethod = "init")
    public DruidDataSource druidDataSource() {              //利用bean类创建第三方类的对象
        DruidDataSource ds = new DruidDataSource();
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setDriverClassName(driverClassName);
        ds.setUrl(url);
        ds.setInitialSize(5);
        ds.setMinIdle(5);
        ds.setMaxActive(20);
        return ds;
    }
}
